#ifndef ___fat32_datos_filesystem

#define ___fat32_datos_filesystem 1

#include "f32_fsbs.c"

struct fat32_posicion_sector {
  unsigned long cluster;
  unsigned char sector;
};

struct fat32_posicion_sector fat32_obtener_posicion_sector(unsigned long, unsigned char);
unsigned long fat32_obtener_sector_lineal(struct fat32_posicion_sector, unsigned char);
unsigned long fat32_ultimo_cluster(void);

struct fat32_posicion_sector fat32_obtener_posicion_sector (unsigned long sector, unsigned char modo) {
  // modo 0: absoluto, modo 1: relativo
  struct fat32_posicion_sector resultado;
  if (!modo) {
    if (sector < bootsector.sectoresReservados) {
      resultado.cluster = 0;
      resultado.sector = sector;
      return resultado;
    }
    sector -= bootsector.sectoresReservados;
    if (sector < (bootsector.sectoresporFAT * bootsectores.copiasFAT)) {
      resultado.cluster = 1;
      resultado.sector = sector;
      return resultado;
    }
    sector -= bootsector.sectoresporFAT * bootsector.copiasFAT;
  }
  resultado.cluster = sector / bootsector.sectoresPorCluster;
  resultado.sector = sector % bootsector.sectoresPorCluster;
  if (!modo) resultado.cluster += 2;
  return resultado;
}

unsigned long fat32_obtener_sector_lineal (struct fat32_posicion_sector posicion, unsigned char modo) {
  unsigned long cluster = posicion.cluster;
  unsigned long sector = posicion.sector;
  if (!modo && (cluster < 2)) {
    if (cluster == 1) sector += bootsector.sectoresReservados;
    return sector;
  }
  if (!modo) cluster -= 2;
  sector += cluster * bootsector.sectoresPorCluster;
  if (!modo) sector += bootsector.sectoresReservados + bootsector.sectoresporFAT * bootsector.copiasFAT;
  return sector;
}

unsigned long fat32_ultimo_cluster (void) {
  unsigned long cantidad;
  cantidad = bootsector.cantidadSectores;
  cantidad -= bootsector.sectoresReservados;
  cantidad -= bootsector.copiasFAT * bootsector.sectoresporFAT;
  cantidad /= bootsector.sectoresPorCluster;
  cantidad ++;
  return cantidad;
}

#endif